進入圖論啦 (゚⊿゚)(゚⊿゚)(゚⊿゚)
今天看的是 2059. Minimum Operations to Convert Number,對於給定的 array,可以進行加減或 bitwise-XOR 操作,如果能算出 target number 就返回最小的計算數字。由於題目有限制,中間計算過程的數字必須在 0-1000 之間,因此可以把不在範圍內的中間數都排除掉。
BFS 的基本操作就是用 queue 去做 pop & append 來實現。另外,這題可以用 array 或 set 記下曾經走過的地方(因為求最小次數,找過的沒必要再重複找第二次,重複找不可能是答案),有點像在做剪枝的動作。
有了 BFS 概念,那雙向 BFS 呢?雙向其實就是同時從起點和終點做搜尋,會需要比較多的空間來儲存中間值。
class Solution:
    def minimumOperations(self, nums: List[int], start: int, goal: int) -> int:
        arr1 = [-1 for _ in range(1001)]
        arr2 = [-1 for _ in range(1001)]
        q = [start]
        q2 = [goal]
        if start <= 1000 and start > 0:
            arr1[start] = 0
        
        curr = 1
        tmp_ans = 1005
        while q:
            n = len(q)
            n2 = len(q2)
            for i in range(n):
                tmp = q.pop(0)
                for j in nums:
                    tmp2 = [tmp+j, tmp-j, tmp^j]
                    for k in tmp2:
                        if k == goal:
                            return curr
                        if k > 1000 or k < 0:
                            continue
                        if arr2[k] > 0:
                            tmp_ans = min(tmp_ans, arr2[k]+curr)
                        if arr1[k] == -1:
                            arr1[k] = curr
                            q.append(k)
            
            if tmp_ans < 1005:
                return tmp_ans
            for i in range(n2):
                tmp = q2.pop(0)
                for j in nums:
                    tmp3 = [tmp+j, tmp-j, tmp^j]
                    for k in tmp3:
                        if k <= 1000 and k >= 0 and arr2[k] == -1:
                            arr2[k] = curr
                            q2.append(k)
            curr += 1
        return -1